package org.zoomdev.zoom.timer.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 对一个Method标注，表示一个定时任务
 *
 * @author randyren
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Timer {

    enum Every {
        NONE,
        SECOND,
        MINUTE,
        HOUR
    }

    /**
     * 如果同一个定时任务正在执行，策略
     */
    enum Strategy {
        /**
         * 不做处理
         */
        NONE,

        /**
         * 放弃本次任务
         */
        ABANDON,

        /**
         * 等待上一个任务执行完成
         */
        WAIT
    }

    /**
     * cron表达式, 可以指定配置 ${config_name}
     *
     * @return
     */
    String value() default "";

    /**
     * 指定every之后，自动生成corn表达式
     *
     * @return
     */
    Every every() default Every.NONE;


    /**
     * 默认如果同一个timer有一个任务正在执行，则跳过本次执行
     *
     * @return
     */
    Strategy strategy() default Strategy.ABANDON;
//
//    /**
//     * 任务执行策略，当某个定时任务执行时间很长，没等到上一次任务执行完毕，下一次任务又开始了，
//     * 如果这个值设置为true，则会放弃本次执行
//     *
//     * @return
//     */
//    boolean abandonWhenExists() default true;
//
//    /**
//     * 任务执行策略，当某个定时任务执行时间很长，没等到上一次任务执行完毕，下一次任务又开始了，
//     * 如果这个值设置为true，则会等待上一次任务执行完毕之后再执行本次任务
//     *
//     * @return
//     */
//    boolean waitWhenExists() default false;

    /**
     * 指定every之后有效 如: Every.SECOND,everyValue 1 :    0/1 * * * * ?
     *
     * @return
     */
    int everyValue() default 1;

    /**
     * 说明，假如有，则会在打印日志的时候展示出来
     *
     * @return
     */
    String comment() default "";
}
